最後要介紹的是在Golang中比較特別的struct/method/interface
對於golang來說,他沒有class的概念,所以如果要宣告一個物件,他有屬性的話,就會使用struct來進行宣告
type person struct {
name string
phone string
}
john := person{
name: "John",
phone: "0912345678",
}
fmt.Println(john)
當你想為struct建立專屬於他的method,在golang可以這麼做
type person struct {
name string
phone string
}
func (p person) tellMeName() (error) {
if p.name == "" {
return errors.New("empty name")
}
fmt.Println("my name is", p.name)
return nil
}
john := person{
name: "John",
phone: "0912345678",
}
if err := john.tellMeName(); err!=nil { // my name is john
fmt.Println(err)
}
baby := person{
name: "",
phone: "",
}
if err := baby.tellMeName(); err!=nil {
fmt.Println(err)// empty name
}
interface是個特別的type,他可以用來預先定義好你宣告完的變數他有哪些method可以使用,然後在事後再將這個變數內放入不同的struct
範例如下
type animal interface {
run()
sleep(time int)
}
type person struct {
name string
}
type dog struct {
name string
}
func (person) run() {
fmt.Println("person can run")
}
func (p person) sleep(time int) {
fmt.Println("person ",p.name," sleep", time, "hour")
}
func (dog) run() {
fmt.Println("dog can run")
}
func (d dog) sleep(time int) {
fmt.Println("dog ",d.name,"sleep", time, "hour")
}
func (dog) barking() {
fmt.Println("barking!!")
}
func atNight(x animal) {
x.sleep(10)
}
john := person{
name: "John",
}
popo := dog{
name: "Popo",
}
atNight(john)
atNight(popo)
另外,關於interface裡面,放進去的method只要都包含即可,可以比他多是可以的
所以,如果宣告一個變數他是interface{}就表示他可以放任何東西進去,這個在未來取第三方來源的資料時很常使用到,但這個我日後再進行說明